﻿namespace Myownexercise
{
    internal class Program
    {
        const int monthWidth = 35;
        const int monthheight = 5;
        const int dayWidth = 4;
        static void Main(string[] args)
        {
            //制定日历的排版，即每个月所占用空间的长宽，每天占用的长
            //设置光标的出现位置
            int x = 0;
            int y = 0;
            //制作2022年的日历，从2022 / 1 / 1开始对每一天进行判断
            //for循环本质（1.初始条件；2.循环进行条件；3.每一次循环结束时做的事）   
            for (DateTime dayTime = new DateTime(2022, 1, 1); dayTime.Year == 2022; dayTime = dayTime.AddDays(1))                                                                                              
            {
                x = monthWidth * (((int)dayTime.Month - 1) % 3);
                y = monthheight * (((int)dayTime.Month - 1) / 3);
                //制作日历框架，以每个月的一号判断月份
                if ((int)dayTime.Day == 1)
                {
                    Console.SetCursorPosition(x, y);
                    Console.Write("{0}月", dayTime.Month);
                    y += 1;
                    Console.SetCursorPosition(x, y);
                    Console.Write("日  一  二  三  四  五  六  ");
                }
                DateTime day = new DateTime(2022, 1, 1);
                do
                {
                    //确定每个月一号的起始位置
                    if ((int)day.Day == 1)
                    {
                        x = monthWidth * (((int)day.Month - 1) % 3);
                        y = monthheight * (((int)day.Month - 1) / 3);
                        y += 2;
                        x = x + dayWidth * (int)day.DayOfWeek;
                        Console.SetCursorPosition(x, y);
                        Console.Write("1");
                    }

                    // 打印周日，从而确定那一行的日期，避免了计算每一天的y
                    /*此处的思路：先判断一号在哪（注意此时光标自动移到下一个）；
                      然后判断下一天，如果下一天是星期天，则换到下一行的开端。然后下下一天加一个dayWidth就好。然后再到下一个星期天，重复循环
                      如果下一天不是星期天，则直接在第一天后面加dayWidth*/

                    if ((int)day.Day != 1)
                    {
                        if ((int)day.DayOfWeek == 0)
                        {
                            x = monthWidth * (((int)day.Month - 1) % 3);
                            y++;
                            Console.SetCursorPosition(x, y);
                            Console.Write((int)day.Day);

                        }
                        else
                        {
                            x += dayWidth;
                            Console.SetCursorPosition(x, y);
                            Console.Write((int)day.Day);
                        }

                    }
                    day = day.AddDays(1);
                } while (day.Year == 2022);
                Console.WriteLine();
            }
        }
    }
}